using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
namespace SuperPolarity
{
public Texture2D PlayerTexture;
public Vector2 Position;
+ public Vector2 Origin;
public bool Active;
public int Lives;
public int Multiplier;
public int Score;
public float Angle;
+ // Physics Properties
+ Vector2 Velocity;
+ Vector2 Acceleration;
+
+ float MaxVelocity;
+ float AccelerationRate;
+ ParticleEngine particleEngine;
+
public int Width
{
get { return PlayerTexture.Width; }
get { return PlayerTexture.Height; }
}
- public void Initialize(Texture2D texture, Vector2 position)
+ public void Initialize(ContentManager Content, Texture2D texture, Vector2 position)
{
PlayerTexture = texture;
Position = position;
Multiplier = 1;
Lives = 3;
Score = 0;
+
+ Origin = new Vector2(PlayerTexture.Width / 2, PlayerTexture.Height / 2);
+ Velocity = new Vector2(0, 0);
+ Acceleration = new Vector2(0, 0);
+
+ MaxVelocity = 5;
+ AccelerationRate = 10;
+
+ List<Texture2D> texturesList = new List<Texture2D>();
+ texturesList.Add(Content.Load<Texture2D>("Graphics\\circle"));
+ texturesList.Add(Content.Load<Texture2D>("Graphics\\diamond"));
+ texturesList.Add(Content.Load<Texture2D>("Graphics\\star"));
+
+ particleEngine = new ParticleEngine(texturesList, Position);
+
+ BindInput();
+ }
+
+ void BindInput()
+ {
+ InputController.Bind("moveX", HandleHorizontalMovement);
+ InputController.Bind("moveY", HandleVerticalMovement);
+ }
+
+ public void HandleHorizontalMovement(float value)
+ {
+ Acceleration.X = value * AccelerationRate;
+ }
+
+ public void HandleVerticalMovement(float value)
+ {
+ Acceleration.Y = value * AccelerationRate;
+ }
+
+ public void AutoDeccelerate(GameTime gameTime)
+ {
+ if (Acceleration.X == 0 && Velocity.X > 0) {
+ if (AccelerationRate * gameTime.ElapsedGameTime.TotalSeconds > Velocity.X)
+ {
+ Velocity.X = 0;
+ Acceleration.X = 0;
+ }
+ else
+ {
+ Acceleration.X = -AccelerationRate;
+ }
+ }
+
+ if (Acceleration.X == 0 && Velocity.X < 0)
+ {
+ if (-AccelerationRate * gameTime.ElapsedGameTime.TotalSeconds < Velocity.X)
+ {
+ Velocity.X = 0;
+ Acceleration.X = 0;
+ }
+ else
+ {
+ Acceleration.X = AccelerationRate;
+ }
+ }
+
+ if (Acceleration.Y == 0 && Velocity.Y > 0)
+ {
+ if (AccelerationRate * gameTime.ElapsedGameTime.TotalSeconds > Velocity.Y)
+ {
+ Velocity.Y = 0;
+ Acceleration.Y = 0;
+ }
+ else
+ {
+ Acceleration.Y = -AccelerationRate;
+ }
+ }
+
+ if (Acceleration.Y == 0 && Velocity.Y < 0)
+ {
+ if (-AccelerationRate * gameTime.ElapsedGameTime.TotalSeconds < Velocity.Y)
+ {
+ Velocity.Y = 0;
+ Acceleration.Y = 0;
+ }
+ else
+ {
+ Acceleration.Y = AccelerationRate;
+ }
+ }
+ }
+
+ public void Update(GameTime gameTime)
+ {
+ Move(gameTime);
+ ChangeAngle();
+ particleEngine.EmitterLocation = Position;
+ particleEngine.Update();
+ }
+
+ public void Move(GameTime gameTime)
+ {
+ AutoDeccelerate(gameTime);
+
+ Velocity.X = Velocity.X + Acceleration.X * (float) gameTime.ElapsedGameTime.TotalSeconds;
+ Velocity.Y = Velocity.Y + Acceleration.Y * (float) gameTime.ElapsedGameTime.TotalSeconds;
+
+ if (Velocity.X > MaxVelocity)
+ {
+ Velocity.X = MaxVelocity;
+ }
+
+ if (Velocity.X < -MaxVelocity)
+ {
+ Velocity.X = -MaxVelocity;
+ }
+
+ if (Velocity.Y > MaxVelocity)
+ {
+ Velocity.Y = MaxVelocity;
+ }
+
+ if (Velocity.Y < -MaxVelocity)
+ {
+ Velocity.Y = -MaxVelocity;
+ }
+
+ Position.X = Position.X + Velocity.X;
+ Position.Y = Position.Y + Velocity.Y;
}
- public void Update()
+ public void ChangeAngle()
{
+ Angle = (float) Math.Atan2(Velocity.Y, Velocity.X);
}
public void Draw(SpriteBatch spriteBatch)
{
- spriteBatch.Draw(PlayerTexture, Position, null, Color.White, Angle, Vector2.Zero, 1f, SpriteEffects.None, 0f);
+ particleEngine.Draw(spriteBatch);
+ spriteBatch.Draw(PlayerTexture, Position, null, Color.White, Angle, Origin, 1f, SpriteEffects.None, 0f);
}
}
}